package com.bjsxt.userCenter.outer.service.impl;

import java.util.Date;
import java.util.UUID;

import javax.annotation.Resource;

import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONObject;
import com.bjsxt.userCenter.common.util.ConstatFinalUtil;
import com.bjsxt.userCenter.common.util.DateFormatUtil;
import com.bjsxt.userCenter.outer.service.IOuterService;
import com.bjsxt.userCenter.users.pojo.AAdmins;

/**
 * 接口的实现类
 * @author zhanghuan
 *
 */
@Service("outerService")
public class OuterServiceImpl implements IOuterService
{
	@Resource
	private DateFormatUtil dateFormatUtil;
	
	/**
	 * 验证加密的字符串
	 * 
	 * 加密参数;sha256(version+pubKey+私钥 priKey) 
	 * 
	 * @return
	 */
	private JSONObject verifyEncryptStr(JSONObject reqJSON)
	{
		JSONObject resultJSON = new JSONObject();
		
		/*取得版本号,公钥*/
		String  version = reqJSON.getString("version");
		String  pubKey = reqJSON.getString("pubKey");
		/*加密前的参数*/
		String  encryptStr = reqJSON.getString("encryptStr");
		
		/* 为了安全,私钥不能从请求中获取,读取本地的配置文件
		 * 私钥:客户端和服务器端同时存储到配置文件中
		 *  */
		String priKey = ConstatFinalUtil.CONFIG_JSON.getString("private.key");
		/*加密后的参数*/
		String encHou = DigestUtils.sha256Hex(version+pubKey+priKey);
		if(encHou.equalsIgnoreCase(encryptStr) || "0".equalsIgnoreCase(ConstatFinalUtil.CONFIG_JSON.getString("version")))
		{
			/*以下情况是成功*/
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0")+"");
		}else
		{
			/*"14":"恶意攻击",*/
			resultJSON.put("code", "14");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("14")+"");
		}
		
		return resultJSON;
	}
	
	/**
	 *  验证Token的第一个版本的实现类
	 * 
	 */
	
	@Override
	public JSONObject verfiy01TokenService(JSONObject reqJSON)
	{
		JSONObject resultJSON = new JSONObject();
		/* 验证一下,加密字符串是否合法 */
		resultJSON = this.verifyEncryptStr(reqJSON);
		if(!"0".equalsIgnoreCase(resultJSON.get("code")+""))
		{
			/* 加密字符串验证不通过 */
			return resultJSON;
		}
		
		/*
		 *	处理数据
		 *	取到token,根据token查询对应的管理员对象 
		 */
		JSONObject dateReqJSON = (JSONObject) reqJSON.get("data");
		String token = dateReqJSON.get("token")+"";
		JSONObject amdinsJSON = ConstatFinalUtil.ADMINS_MAP.get(token);
		
		if(amdinsJSON!=null)
		{
			/*拼装下行数据*/
			JSONObject dateResJSON = new JSONObject();
			dateResJSON.put("admins", amdinsJSON);
			
			resultJSON.put("data", dateResJSON);
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0")+"");
		}else
		{
			/*木有登陆,token非法*/
			resultJSON.put("code", "12");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("12")+"");
		}
		
		return resultJSON;
	}
	
	/**
	 * 保存token的实现类
	 */
	@Override
	public String saveTokenService(AAdmins admins)
	{
		String token = UUID.randomUUID().toString();
		/**
		 * 管理员的JSON对象
		 * {
		 * 		id:"",
		 * 		email:"",
		 * 		name:"",
		 * 		lastLoginTime:""
		 * }
		 * 
		 */
		JSONObject adminsJSON = new JSONObject();
		adminsJSON.put("id", admins.getId()+"");
		adminsJSON.put("email", admins.getEmail());
		adminsJSON.put("name", admins.getName());
		adminsJSON.put("lastLoginTime", this.dateFormatUtil.dateTimeStr(admins.getLastLoginTime()));
		/*验证token过期时间*/
		adminsJSON.put("verifyDate", this.dateFormatUtil.dateTimeStr(new Date()));
		/**
		 * AVASE Map:key:uuid(Token),值是管理员对象(JSON);
		 * Map
		 */
		ConstatFinalUtil.ADMINS_MAP.put(token, adminsJSON);
		ConstatFinalUtil.SYS_LOGGER.info("管理员map:{}",ConstatFinalUtil.ADMINS_MAP);
		return token;
	}

}
